package com.hjl.service.impl;

import com.alibaba.druid.sql.visitor.functions.Nil;
import com.alibaba.druid.util.StringUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hjl.pojo.User;
import com.hjl.service.UserService;
import com.hjl.mapper.UserMapper;
import com.hjl.utils.JwtHelper;
import com.hjl.utils.MD5Util;
import com.hjl.utils.Result;
import com.hjl.utils.ResultCodeEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

/**
 * @author 86176
 * @description 针对表【news_user】的数据库操作Service实现
 * @createDate 2024-08-21 21:25:42
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

    @Autowired
    private UserMapper userMapper;
    @Autowired
    private JwtHelper jwtHelper;


    /**
     * 登录业务实现
     *
     * @param user
     * @return result封装
     */
    @Override
    public Result login(User user) {
        //根据输入账号查询数据库里对应的信息
        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper();
        queryWrapper.eq(User::getUsername, user.getUsername());//select * from user where username = ?
        User loginUser = userMapper.selectOne(queryWrapper);

        //账号判断
        if (loginUser == null) {
            //账号错误  返回501
            return Result.build(null, ResultCodeEnum.USERNAME_USED);
        }
        //判断密码  如果密码用户输入不为空并且数据库里的密码（已经加密）和用户输入的密码（手动md5加密）一致
        if (!StringUtils.isEmpty(user.getUserPwd())
                && loginUser.getUserPwd().equals(MD5Util.encrypt(user.getUserPwd()))) {
            //账号密码正确
            //根据用户唯一标识生成token
            String token = jwtHelper.createToken(Long.valueOf(loginUser.getUid()));
            Map data = new HashMap();
            data.put("token", token);

            //账号密码正确 将生成的token字符串保存在result中  返回200
            return Result.ok(data);
        }
        //密码错误 返回503
        return Result.build(null, ResultCodeEnum.PASSWORD_ERROR);
    }

    /**
     * 根据token获取用户信息
     *
     * @param token
     * @return
     */
    @Override
    public Result getUserInfo(String token) {
        //判断token在不在有效期
        boolean expiration = jwtHelper.isExpiration(token);
        if (expiration) {
            //token失效 为未登录状态
            return Result.build(null, ResultCodeEnum.NOTLOGIN);
        }

        //获取token对应的id
        int userId = jwtHelper.getUserId(token).intValue();
        //根据id查询用户数据
        User user = userMapper.selectById(userId);//selectById方法要给主键属性加上@tableid注解


        if (user != null) {
            //将用户密码隐藏（置为空即可）
            user.setUserPwd("");
            //将用户数据封装到map中
            Map data = new HashMap();
            data.put("loginUser", user);
            return Result.ok(data);
        }
        return Result.build(null, ResultCodeEnum.NOTLOGIN);
    }

    /**
     * 检查用户名是否可用
     *
     * @param username
     * @return
     */
    @Override
    public Result checkUserName(String username) {
        //获取账号数据
        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(User::getUsername, username);
//        selectCount：查询username=username（用户输入的）的个数
//        查询总记录数
        Long count = userMapper.selectCount(queryWrapper);//select count（1） from user where username = username（用户输入的）
        if (count == 0) {
            //账号可以使用
            return Result.ok(null);//200
        }
        //count>0不可用
        return Result.build(null,ResultCodeEnum.USERNAME_USED);//505
    }

    @Override
    public Result regist(User user) {
        //检查是否已经被注册
        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(User::getUsername, user.getUsername());
        //selectCount：查询username=username（用户输入的）的个数
        //  查询总记录数
        Long count = userMapper.selectCount(queryWrapper);//select count（1） from user where username = username（用户输入的）
        if (count > 0) {
            //账号不可以使用
            return Result.build(null, ResultCodeEnum.USERNAME_USED);//505
        }
//        没有被注册则保存
        //明文传的密码,存入数据库要md5加密
        user.setUserPwd(MD5Util.encrypt(user.getUserPwd()));
        int i = userMapper.insert(user);
        return Result.ok(null);//200
    }

}




